﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows;
using System.Reflection;
using System.Diagnostics;
using BAL.EstRec;
using System.IO;

namespace MasterDetailEx.Notify
{
    public class Updates
    {
        public static Thread t = null;

        public static bool CheckIsAlive()
        {

            if (Updates.t != null)
            {
                return Updates.t.IsAlive;

            }
            return false;

        }/////////



        public static void start(MainWindow mw, AppConfs c)
        {
            try
            {
                if (!Updates.CheckIsAlive())
                {
                    
                    Updates.t = new Thread(() =>
                    {
                        Action a = () => searchforUpdate(mw, c);
                        Application.Current.Dispatcher.BeginInvoke(a, System.Windows.Threading.DispatcherPriority.Background);

                    });

                    Updates.t.IsBackground = true;
                    Updates.t.Start();
                }// if
            }
            catch (Exception ex)
            {                
                throw ex;
            }
            
        }// end start

        protected static void searchforUpdate(MainWindow mw, AppConfs cn)
        {
            List<string> paquetes = new List<string>();

            Assembly assembly = Assembly.GetExecutingAssembly();
            FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
            int actualVersion = int.Parse(fvi.ProductVersion.ToString().Replace(".",""));
            int pkg_num=0;


            

            if (Directory.Exists(cn.cnf.UpdateFilesFolder))
            {
                paquetes = Directory.GetFiles(cn.cnf.UpdateFilesFolder).ToList<string>();
                if (paquetes.Count >0)
                {
                    paquetes.Sort();
                    paquetes.Reverse();

                    foreach (string item in paquetes)
                    {
                        if (int.TryParse(item.Split('\\').Last().Split('.')[0].Split('_').Last(), out pkg_num))
                        {

                            try
                            {
                                BAL.EstRec.SYNC.Sync.upsertSrchSyncLog();
                            }
                            catch (Exception z)
                            {
                                Console.WriteLine(z.Message +". "+z.InnerException);
                            }

                            if (actualVersion.CompareTo(pkg_num) == -1)
                            {
                                if (MessageBox.Show("Existe una nueva versión de la aplicación ¿Desea actualizarla en este momento?", "Actualización automática", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                                {
                                    try
                                    {
                                        if (File.Exists(cn.cnf.CarpetaInstalacion.ToString() + cn.cnf.UpdaterProcess.ToString()))
                                        {
                                            System.Diagnostics.Process.Start(cn.cnf.CarpetaInstalacion.ToString() + cn.cnf.UpdaterProcess.ToString());
                                        }
                                        else MessageBox.Show("No se encuentra el actualizador de la aplicación en la carpeta de instalación: " + cn.cnf.CarpetaInstalacion.ToString());
                                    }
                                    catch (Exception ex)
                                    {
                                        MessageBox.Show("No se puede realizar la actualización.\n"+ex.Message,ex.InnerException.ToString(),MessageBoxButton.OK);
                                    }
                                    
                                }
                                else return;
                            }
                        }
                    }
                }//if
            }
            
        }

    }// end class
}
